package cn.westv.scps.web.controller.base;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;

import cn.westv.scps.utils.StringUtils;

/**
 * Created by Administrator on 2017/05/22.
 * 这是VO类的基础类，有Vo常用的封装和工具,继承此类后，可以根据需要自己编写子类的getter方法获取成员变量t的值/setter方法将对实体象赋值给成员变量t
 * @author jiawenbin
 */
public abstract class BaseVo<T> {
	protected T t;
	private Class<T> beanClass;
//	private Integer page;
//	private Integer rows;
	
	public BaseVo() {
		Class clazz = this.getClass();// 这一步是获取继承这个类的子类的Class对象
		ParameterizedType type = (ParameterizedType) clazz.getGenericSuperclass();// 这一步是获得继承这个类的父类的“带泛型的”数据类型，即BaseDAO<T>的实际参数类型
		this.beanClass = (Class<T>) type.getActualTypeArguments()[0];// 这一步是获得泛型类型中的Class对象，即T的实际Class对象
	}

	/**
	 * 这是获取Vo的方法
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	public T poToVo(T entity) throws Exception{
		return poToVo(null,entity);
	}
	
	/**
	 * 这是获取Vo的方法
	 * @param form
	 * @param entity
	 * @return
	 * @throws Exception
	 */
	public T poToVo(BaseVo<T> form, T entity)
			throws Exception {
		if (entity == null) {
			return null;
		}
		if(form == null) {
			Class clazz = this.getClass();
			form = (BaseVo<T>) clazz.newInstance();
		}
		Class<T> entityClass = beanClass;
		Field[] fields = entityClass.getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			Object value = field.get(entity);
			if (value instanceof String) {
				String valueStr = (String) value;
				if (StringUtils.isNotBlank(valueStr)) {
					field.set(form.getT(), valueStr);
				}
			}
		}
		return entity;
	}

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}

//	public Integer getPage() {
//		return page;
//	}
//
//	public void setPage(Integer prePage) {
//		this.page = prePage;
//	}
//
//	public Integer getRows() {
//		if(rows == null || rows == 0) {
//			rows = 20;
//		}
//		return rows;
//	}
//
//	public void setRows(Integer rows) {
//		this.rows = rows;
//	}

	public Class<T> getBeanClass() {
		return beanClass;
	}

	
}
